/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/



 
#pragma once






#include "基本类型.h"
#include <string>



inline int64 f_取位置数值(const int64 num, const int32 pos) {
	int64 temp = 1;
	for (int i = 0; i < pos - 1; i++)
		temp *= 10;

	return (num / temp) % 10;
}
inline uint64 f_取位置数值(const uint64 num, const int32 pos) {
	uint64 temp = 1;
	for (int i = 0; i < pos - 1; i++)
		temp *= 10;

	return (num / temp) % 10;
}

 

Inline std::wstring f_整数值转宽字符串(const uint32 值) {
	std::wstring str;
	bool 是否记录 = false;

	if (!值) {
		str += 48;
	}
	else {
		for (int8 i = 10; i > 0; --i) {
			int32 新值 = f_取位置数值(uint64(值), i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += int32(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
	}
	

	return str;
}

Inline std::wstring f_整数值转宽字符串64(const uint64 值) {
	std::wstring str;
	bool 是否记录 = false;

	if (!值) {
		str += 48;
	}
	else {
		for (int8 i = 19; i > 0; --i) {
			int32 新值 = f_取位置数值(值, i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += int32(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
	}


	return str;
}


inline std::string f_整数值转字符串(const uint32 值) {
	std::string str;
	bool 是否记录 = false;

	if (!值) {
		str += 48;
	}
	else {
		for (int8 i = 10; i > 0; --i) {
			int32 新值 = f_取位置数值(uint64(值), i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += int8(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
	}

	return str;
}



inline std::string f_整数值转字符串(int32 值) {
	std::string str;
	bool 是否记录 = false;

	if (值 < 0) {
		str += "-";
		值 = -值;
	}


	if (!值) {
		str += 48;
	}
	else {
		for (int8 i = 10; i > 0; --i) {
			int32 新值 = f_取位置数值(int64(值), i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += int8(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
	}

	return str;
}

inline std::string f_整数值转字符串(uint64 值) {
	std::string str;
	bool 是否记录 = false;

	if (!值) {
		str += 48;
	}
	else {
		for (int8 i = 24; i > 0; --i) {
			int32 新值 = f_取位置数值(值, i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += int8(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
	}

	return str;
}




inline std::wstring f_整数值转宽字符串(const int32 值, uint8 位数 = 10) {
	std::wstring str;
	bool 是否记录 = false;

	if (!值) {
		str += 48;
	}
	else {
		if (值 < 0) {
			str += L"-";
		}
		else if (值 == 0) {
			str += L"0";
			return str;
		}

		for (int8 i = 位数; i > 0; --i) {
			int32 新值 = f_取位置数值(int64(值), i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += uint16(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
	}

	return str;
}

inline std::wstring f_浮点数值转宽字符串(const float32 值, const uint16 小数显示数量=6) {
	std::wstring str;
	bool 是否记录 = false;

	int8 text[32];
	sprintf(text, "%.8f", 值);

	for (int8 i = 0; i < 32; ++i) {
		if (text[i] == '\0') break;
		str += int16(text[i]);
	}
	for (uint8 i = 0; i < 10; ++i) {
		if (str.back() == L'0') {
			str.pop_back();
		}
		else {
			if(str.back() == L'.')
				str.push_back(L'0');
			break;
		}
	}
	return str;
}





inline std::string f_浮点数值转字符串(const float32 值, const uint16 小数显示数量 = 6) {
	std::string str;
	bool 是否记录 = false;

	int8 text[32];
	sprintf(text, "%.8f", 值);

	for (int8 i = 0; i < 32; ++i) {
		if (text[i] == '\0') break;
		str += int16(text[i]);
	}
	for (uint8 i = 0; i < 10; ++i) {
		if (str.back() == '0') {
			str.pop_back();
		}
		else {
			if (str.back() == '.')
				str.push_back('0');
			break;
		}
	}
	return str;

	if (!值) {
		str += 48;
	}
	else {
		int32 整数部分 = 0;
		int32 小数部分 = int32(modf(值, (float32*)& 整数部分) * 1000000000);
		整数部分 = int32(值);
		if (值 < 0) str += "-";

		for (int8 i = 10; i > 0; --i) {
			int32 新值 = f_取位置数值(int64(整数部分), i);
			if (新值 && !是否记录) 是否记录 = true;

			if (是否记录) {
				str += int8(fabs(新值) + 48);
				//str.insert(str.begin(), 新值 + 48);
			}
		}
		if (!str.size() || str[0] == '-') str += "0";
		str += ".";

		if (小数部分 == 0) {
			str += "0";
		}
		else {
			是否记录 = false;
			for (int8 i = 10; i > 0; --i) {
				int32 新值 = f_取位置数值(int64(小数部分), i);
				if (新值 && !是否记录) 是否记录 = true;
				if (是否记录) {
					str += uint8(fabs(新值) + 48);
					//str.insert(str.begin(), 新值 + 48);
				}
			}
		}



	}

	return str;
}








int32 f_字符串转I32(const std::wstring& text);
int32 f_字符串转I32(const std::string& text);

float32 f_字符串转F32(const std::wstring& text);


Inline std::string f_strVal_整数转16进制字符串(uint8* src, uint8 位数 = 4) {
	std::string 结果 = "";

	for (uint8 i = 0; i < 位数; ++i) {
		结果 += 48 + src[i*2] % 16;
		结果 += 48 + src[i*2+1] / 16;
	}
	
	return 结果;
}

